#include "bucquage.h"
#include "ui_bucquage.h"
//#include <iostream>

Bucquage::Bucquage(QWidget *parent) :
    QWidget(parent),
    ui(new Ui::Bucquage)
{
    ui->setupUi(this);

    QSettings s;

    db = QSqlDatabase::database("guest");

    styleNeg = "QDoubleSpinBox {color : red;}";
    stylePos = "QDoubleSpinBox {color : green;}";

    blocker = false;
    limit = s.value("limit_blockage").toDouble();

    recherche = "";

    moneydelegate = new MoneyDelegate(this);
    QteDelegate *qtedelegate = new QteDelegate(this);

    modelChoix = new QStandardItemModel(0,4,this);
    modelConsos = new PromsModel(this);
    ui->listChoisi->setModel(modelChoix);
    ui->listChoisi->hideColumn(0);
    ui->listChoisi->setItemDelegateForColumn(2,moneydelegate);
    ui->listChoisi->setItemDelegateForColumn(3,qtedelegate);

}

Bucquage::~Bucquage()
{
    delete ui;
    delete pg;
    delete modelChoix;
    delete modelConsos;
    delete moneydelegate;
}

void Bucquage::setPg(Pg *p)
{

    pg = p;
    ui->groupInfos->setTitle(pg->getBucque());
    ui->spinAvoir->setValue(pg->getSolde());
    ui->spinInit->setValue(pg->getSolde());

    if(ui->spinInit->value() < 0){
        ui->spinInit->setStyleSheet(styleNeg);
    }else{
        ui->spinInit->setStyleSheet(stylePos);
    }

    moneydelegate = new MoneyDelegate(this);
    QteDelegate *qtedelegate = new QteDelegate(this);

    modelChoix = new QStandardItemModel(0,4,this);
    modelConsos = new PromsModel(this);
    ui->listChoisi->setModel(modelChoix);
    ui->listChoisi->hideColumn(0);
    ui->listChoisi->setItemDelegateForColumn(2,moneydelegate);
    ui->listChoisi->setItemDelegateForColumn(3,qtedelegate);

    majChoix();
    majListeConso();
    majHisto();


}

void Bucquage::resetModels()
{
    delete modelChoix;
    recherche = "";
}


void Bucquage::bucquer(){

    db.transaction();

    QSqlQuery q(db);

    q.prepare("CALL bucquer(:c,:id)");
    q.bindValue(":id",pg->getId());
    for(int k = 0 ; k < modelChoix->rowCount() ; k++)
    {
        q.bindValue(":c",modelChoix->index(k,0).data().toInt());
        for(int i = 0 ; i < modelChoix->index(k,3).data().toInt() ; i++)
        {
            q.exec();
        }
    }

    db.commit();



    emit termine();

}

void Bucquage::keyPressEvent(QKeyEvent *e)
{
    //QMessageBox::information(this,"",QString::number(e->key()));

    this->setFocus();

    //Si la touche est une lettre
    if((e->key() >= Qt::Key_A && e->key() <= Qt::Key_Z) || (e->key()>=Qt::Key_0 && e->key()<=Qt::Key_9) )
    {

        //On modifiele filtre
        recherche += e->text();

    }else if(e->key() == Qt::Key_Backspace){

        //Si c'est un retour arrière, on vide le filtre
        recherche = "";

    }else if(e->key() == Qt::Key_Return || e->key() == Qt::Key_Enter ){

        //Si c'est entrer on bucquer
        bucquer();

    }else if(e->key() == Qt::Key_Escape){

        //Si c'est echape on annule tout
        emit termine();

    }else if(e->key() >= Qt::Key_F1 && e->key() <= Qt::Key_F12){

        //Si c'est une touche F0 ...

        //On récupère la ligne concernée
        int i = e->key()- Qt::Key_F1;

        //En fonction du modificateur, on ajoute ou retire une conso
        if(e->modifiers() == Qt::NoModifier){
            if(modelConsos->rowCount() > i)
                ajouterConso(i);
        }else if(e->modifiers() == Qt::ControlModifier){
            if(modelChoix->rowCount() > i)
                retirerConso(i);
        }
    }

    majListeConso();
}

void Bucquage::majListeConso(){
    //On nettoie la liste Dispo
    delete modelConsos;

    // On récupère le model
    modelConsos = Statistiques::consoMax(recherche,pg->getId());


    //On affiche le model
    ui->listDispo->setModel(modelConsos);
    ui->listDispo->hideColumn(0);
    ui->listDispo->hideColumn(3);
    ui->listDispo->setItemDelegateForColumn(2,moneydelegate);
    ui->listDispo->resizeColumnsToContents();

}

void Bucquage::majHisto()
{
    //std::cout << "majHisto()\n";
    ui->spinHisto->setHtml(ModuleAccueil::toHtml("Historique", pg));
    ui->textTrans->setHtml(ModuleAccueil::toHtml("Transactions",pg));
    //std::cout << "FIN majHisto()\n";
}


void Bucquage::majChoix(){

    // On fait le total

    double tot = 0.0;

    for(int i =0;i<modelChoix->rowCount();i++){
        // On ajoute le prix de chaque conso
        tot += modelChoix->index(i,2).data().toDouble() * modelChoix->index(i,3).data().toInt();
    }

    //On affecte les valeurs aux spins
    ui->spinTotal->setValue(tot);
    ui->spinAvoir->setValue(pg->getSolde() - tot);

    // On modifie les couleurs
    if(ui->spinAvoir->value() < 0){
        ui->spinAvoir->setStyleSheet(styleNeg);
    }else{
        ui->spinAvoir->setStyleSheet(stylePos);
    }

    // On vérifie le blocquage
    blocker = (pg->getSolde() - tot < limit) ? true : false;

    if(blocker)
    {
        ui->label->setHidden(true);
        ui->listDispo->setHidden(true);
        ui->spinAvoir->setStyleSheet("background-color:#770000;color:#ffffff;");
        ui->spinInit->setStyleSheet("background-color:#770000;color:#ffffff;");
        ui->spinTotal->setStyleSheet("background-color:#770000;color:#ffffff;");
        ui->spinHisto->setStyleSheet("background-color:#770000;");
        ui->textTrans->setStyleSheet("background-color:#770000;");
        this->setStyleSheet("background-color:red;");
    }
    else
    {
        ui->label->setHidden(false);
        ui->listDispo->setHidden(false);
        ui->spinTotal->setStyleSheet("background-color:#000000;color:#ffffff;");
        ui->spinHisto->setStyleSheet("background-color:#000000;");
        ui->textTrans->setStyleSheet("background-color:#000000;");
        this->setStyleSheet("background-color:black;");
    }

    ui->listChoisi->resizeColumnsToContents();

    this->setFocus();
}



void Bucquage::ajouterConso(int i){
    // Si le pg peut consommer plus
    if(!blocker){

        // On récupère l'item correspondant au choix
        QList<QStandardItem *> l = modelChoix->findItems(modelConsos->index(i,0).data().toString());

        // On vérifie si la conso est déjà prise une fois
        if(l.count() > 0)
        {
            // On récupère la ligne
            int row = modelChoix->indexFromItem(l.at(0)).row();
            // On ajoute 1
            modelChoix->setData(modelChoix->index(row,3),modelChoix->index(row,3).data().toInt() + 1);


        }else{
            // On crée une nouvelle ligne
            int k = modelChoix->rowCount();
            modelChoix->insertRow(k);

            // On insère les données sur cette ligne
            for(int j=0; j<3; j++)
                modelChoix->setData(modelChoix->index(k,j),modelConsos->index(i,j).data().toString());

            modelChoix->setData(modelChoix->index(k,3),"1");

            // On affiche les touches
            modelChoix->setHeaderData(k,Qt::Vertical,"Ctrl + F"+QString::number(k+1)+" -> ");



        }

        majChoix();

    }else {
        QMessageBox msgBx;
        msgBx.setText("Si tu veux consommer plus, remet un chèque !");
        msgBx.setStyleSheet("font-size:30px;");
        msgBx.exec();
    }

}


void Bucquage::retirerConso(int i){

    // On récupère la quantité de cette ligne
    int nb = modelChoix->index(i,3).data().toInt();

    if(nb > 1){
        // On retire 1
        modelChoix->setData(modelChoix->index(i,3), QVariant(nb - 1));
    }else{
        // On la supprime
        modelChoix->removeRow(i);
    }

    majChoix();
}
